/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is Forte for Java, Community Edition. The Initial * Developer of the Original Code is Sun Microsystems, Inc. Portions * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved. */ package org.netbeans.modules.form; import java.beans.*; import java.lang.reflect.Method; import java.util.*; import org.openide.TopManager; import org.openide.util.Utilities; /** The MethodPicker is a form which allows user to pick one of methods * with specified required return type. * * @author Ian Formanek * @version 1.00, Aug 29, 1998 */ public class MethodPicker extends javax.swing.JDialog { public static final int CANCEL = 0; public static final int OK = 1; static final long serialVersionUID =7355140527892160804L; /** Initializes the Form */ public MethodPicker(java.awt.Frame parent, FormManager2 manager, RADComponent componentToSelect, Class requiredType) { super (parent != null ? parent : TopManager.getDefault ().getWindowManager ().getMainWindow (), true); this.manager = manager; this.requiredType = requiredType; initComponents (); insidePanel.setBorder (new javax.swing.border.EmptyBorder (new java.awt.Insets(8, 8, 3, 8))); buttonsPanel.setBorder (new javax.swing.border.EmptyBorder (new java.awt.Insets(0, 5, 5, 5))); setDefaultCloseOperation (javax.swing.JDialog.DO_NOTHING_ON_CLOSE); addWindowListener (new java.awt.event.WindowAdapter () { public void windowClosing (java.awt.event.WindowEvent evt) { cancelDialog (); } } ); // attach cancel also to Escape key getRootPane().registerKeyboardAction( new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancelDialog (); } }, javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_ESCAPE, 0, true), javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW ); Collection allComponents = manager.getAllComponents (); components = (RADComponent[])allComponents.toArray (new RADComponent [allComponents.size ()]); int selIndex = -1; for (int i = 0; i < components.length; i++) { componentsCombo.addItem (components[i].getName ()); if ((componentToSelect != null) && (componentToSelect.equals (components[i]))) selIndex = i; } if (selIndex != -1) { selectedComponent = components[selIndex]; componentsCombo.setSelectedIndex (selIndex); } methodList.setSelectionMode (javax.swing.ListSelectionModel.SINGLE_SELECTION); updateMethodList (); // localize components setTitle ( java.text.MessageFormat.format ( FormEditor.getFormBundle ().getString ("CTL_FMT_CW_SelectMethod"), new Object[] { Utilities.getShortClassName (requiredType) } ) ); componentLabel.setText (FormEditor.getFormBundle ().getString ("CTL_CW_Component")); // "Component:" okButton.setText (FormEditor.getFormBundle ().getString ("CTL_OK")); // "OK" cancelButton.setText (FormEditor.getFormBundle ().getString ("CTL_CANCEL")); //"Cancel" // parametersButton.setText (FormEditor.getFormBundle ().getString ("CTL_CW_Parameters")); // "Parameters" updateButtons (); pack (); org.openidex.util.Utilities2.centerWindow (this); } public java.awt.Dimension getPreferredSize () { java.awt.Dimension pref = super.getPreferredSize (); return new java.awt.Dimension (Math.max (pref.width, 250), Math.max (pref.height, 300)); } int getReturnStatus () { return returnStatus; } RADComponent getSelectedComponent () { return selectedComponent; } void setSelectedComponent (RADComponent selectedComponent) { if (selectedComponent != null) componentsCombo.setSelectedItem (selectedComponent.getName ()); } MethodDescriptor getSelectedMethod () { if ((selectedComponent == null) || (methodList.getSelectedIndex () == -1)) return null; return descriptors [methodList.getSelectedIndex ()]; } void setSelectedMethod (MethodDescriptor selectedMethod) { if (selectedMethod == null) { methodList.setSelectedIndex (-1); } else { methodList.setSelectedValue (FormUtils.getMethodName (selectedMethod), true); } } // ---------------------------------------------------------------------------- // private methods private void addComponentsRecursively (ComponentContainer cont, Vector vect) { RADComponent[] children = cont.getSubBeans (); for (int i = 0; i < children.length; i++) { vect.addElement (children[i]); if (children[i] instanceof ComponentContainer) addComponentsRecursively ((ComponentContainer)children[i], vect); } } private void updateMethodList () { RADComponent sel = getSelectedComponent (); if (sel == null) { methodList.setListData (new Object [0]); methodList.revalidate (); methodList.repaint (); } else { MethodDescriptor[] descs = sel.getBeanInfo ().getMethodDescriptors (); ArrayList filtered = new ArrayList (); for (int i = 0; i < descs.length; i ++) { if (requiredType.isAssignableFrom (descs[i].getMethod ().getReturnType ()) && (descs[i].getMethod ().getParameterTypes ().length == 0)) // [FUTURE: - currently we allow only methods without params] { filtered.add (descs[i]); } } // sort the methods by name Collections.sort (filtered, new Comparator () { public int compare(Object o1, Object o2) { return ((MethodDescriptor)o1).getName ().compareTo (((MethodDescriptor)o2).getName ()); } } ); descriptors = new MethodDescriptor[filtered.size ()]; filtered.toArray (descriptors); String[] items = new String [descriptors.length]; for (int i = 0; i < descriptors.length; i++) items[i] = FormUtils.getMethodName (descriptors[i]); methodList.setListData (items); methodList.revalidate (); methodList.repaint (); } } private void updateButtons () { // parametersButton.setEnabled (false); // [FUTURE: - disabled for now] if ((getSelectedComponent () == null) || (getSelectedMethod () == null)) { okButton.setEnabled (false); // parametersButton.setEnabled (false); } else { if (getSelectedMethod ().getMethod ().getParameterTypes ().length > 0) { okButton.setEnabled (false); // parametersButton.setEnabled (true); } else { okButton.setEnabled (true); // parametersButton.setEnabled (false); } } } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the FormEditor. */ private void initComponents () {//GEN-BEGIN:initComponents insidePanel = new javax.swing.JPanel (); propertiesScrollPane = new javax.swing.JScrollPane (); methodList = new javax.swing.JList (); jPanel1 = new javax.swing.JPanel (); componentLabel = new javax.swing.JLabel (); componentsCombo = new javax.swing.JComboBox (); buttonsPanel = new javax.swing.JPanel (); leftButtonsPanel = new javax.swing.JPanel (); parametersButton = new javax.swing.JButton (); rightButtonsPanel = new javax.swing.JPanel (); okButton = new javax.swing.JButton (); cancelButton = new javax.swing.JButton (); insidePanel.setLayout (new java.awt.BorderLayout (0, 5)); methodList.addListSelectionListener (new javax.swing.event.ListSelectionListener () { public void valueChanged (javax.swing.event.ListSelectionEvent evt) { methodListValueChanged (evt); } } ); propertiesScrollPane.setViewportView (methodList); insidePanel.add (propertiesScrollPane, java.awt.BorderLayout.CENTER); jPanel1.setLayout (new java.awt.BorderLayout (8, 0)); componentLabel.setText (FormEditor.getFormBundle ().getString ("CTL_Component")); jPanel1.add (componentLabel, java.awt.BorderLayout.WEST); componentsCombo.addItemListener (new java.awt.event.ItemListener () { public void itemStateChanged (java.awt.event.ItemEvent evt) { componentsComboItemStateChanged (evt); } } ); jPanel1.add (componentsCombo, java.awt.BorderLayout.CENTER); insidePanel.add (jPanel1, java.awt.BorderLayout.NORTH); getContentPane ().add (insidePanel, java.awt.BorderLayout.CENTER); buttonsPanel.setLayout (new java.awt.BorderLayout ()); leftButtonsPanel.setLayout (new java.awt.FlowLayout (0, 5, 5)); parametersButton.setText (FormEditor.getFormBundle ().getString ("CTL_CW_Parameters")); leftButtonsPanel.add (parametersButton); buttonsPanel.add (leftButtonsPanel, java.awt.BorderLayout.WEST); rightButtonsPanel.setLayout (new java.awt.FlowLayout (2, 5, 5)); okButton.setText (FormEditor.getFormBundle ().getString ("CTL_OK")); okButton.addActionListener (new java.awt.event.ActionListener () { public void actionPerformed (java.awt.event.ActionEvent evt) { okButtonActionPerformed (evt); } } ); rightButtonsPanel.add (okButton); cancelButton.setText (FormEditor.getFormBundle ().getString ("CTL_CANCEL")); cancelButton.addActionListener (new java.awt.event.ActionListener () { public void actionPerformed (java.awt.event.ActionEvent evt) { cancelButtonActionPerformed (evt); } } ); rightButtonsPanel.add (cancelButton); buttonsPanel.add (rightButtonsPanel, java.awt.BorderLayout.EAST); getContentPane ().add (buttonsPanel, java.awt.BorderLayout.SOUTH); }//GEN-END:initComponents private void methodListValueChanged (javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_methodListValueChanged if (methodList.getSelectedIndex () == -1) selectedMethod = null; else selectedMethod = descriptors[methodList.getSelectedIndex ()]; updateButtons (); }//GEN-LAST:event_methodListValueChanged private void componentsComboItemStateChanged (java.awt.event.ItemEvent evt) {//GEN-FIRST:event_componentsComboItemStateChanged if (componentsCombo.getSelectedIndex () == -1) selectedComponent = null; else selectedComponent = components[componentsCombo.getSelectedIndex ()]; updateMethodList (); }//GEN-LAST:event_componentsComboItemStateChanged private void okButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed returnStatus = OK; setVisible (false); }//GEN-LAST:event_okButtonActionPerformed private void cancelButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed cancelDialog (); }//GEN-LAST:event_cancelButtonActionPerformed /** Closes the dialog */ private void closeDialog(java.awt.event.WindowEvent evt) {//GEN-FIRST:closeDialog cancelDialog (); }//GEN-LAST:closeDialog private void cancelDialog () { returnStatus = CANCEL; setVisible (false); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel insidePanel; private javax.swing.JScrollPane propertiesScrollPane; private javax.swing.JList methodList; private javax.swing.JPanel jPanel1; private javax.swing.JLabel componentLabel; private javax.swing.JComboBox componentsCombo; private javax.swing.JPanel buttonsPanel; private javax.swing.JPanel leftButtonsPanel; private javax.swing.JButton parametersButton; private javax.swing.JPanel rightButtonsPanel; private javax.swing.JButton okButton; private javax.swing.JButton cancelButton; // End of variables declaration//GEN-END:variables private FormManager2 manager; private int returnStatus = CANCEL; private RADComponent[] components; private Class requiredType; private MethodDescriptor[] descriptors; private RADComponent selectedComponent; private MethodDescriptor selectedMethod; } /* * Log * 17 Gandalf 1.16 1/12/00 Pavel Buzek I18N * 16 Gandalf 1.15 1/10/00 Ian Formanek Fixed bug 4936 - * Incorrect initialization of Form Connection dialog * 15 Gandalf 1.14 1/5/00 Ian Formanek NOI18N * 14 Gandalf 1.13 11/27/99 Patrik Knakal * 13 Gandalf 1.12 11/25/99 Ian Formanek Uses Utilities module * 12 Gandalf 1.11 10/23/99 Ian Formanek NO SEMANTIC CHANGE - Sun * Microsystems Copyright in File Comment * 11 Gandalf 1.10 10/9/99 Ian Formanek Fixed bug 4151 - Menus, * MenuItems etc. are missing in Component combo box in Form Connection * (or Connection Wizard). * 10 Gandalf 1.9 7/31/99 Ian Formanek Parameters Button is not * displayed - not in the .form file (i.e. when opened as a form, it will * be recreated !) * 9 Gandalf 1.8 7/31/99 Ian Formanek Localization completed * 8 Gandalf 1.7 6/29/99 Ian Formanek Removed incorrect cast * 7 Gandalf 1.6 6/9/99 Ian Formanek ---- Package Change To * org.openide ---- * 6 Gandalf 1.5 6/1/99 Ian Formanek Fixed removed event * handlers * 5 Gandalf 1.4 5/31/99 Ian Formanek Updated to X2 form * format * 4 Gandalf 1.3 5/24/99 Ian Formanek Non-Visual components * 3 Gandalf 1.2 5/17/99 Ian Formanek Fixed bug 1810 - * Connection Wizard: the items in list should be alphabetically sorted. * 2 Gandalf 1.1 5/15/99 Ian Formanek * 1 Gandalf 1.0 5/13/99 Ian Formanek * $ */